package com.egg.common.core.constant.rabbit;

/**
 * @author east
 * @describe RabbitmqExchange 类型
 */
public interface RabbitExchange {

    /**
     * Fanout Exchange
     * 会忽略 RoutingKey 的设置，直接将 Message 广播到所有绑定的 Queue 中。
     */
    String FANOUT = "exchange.fanout";

    /**
     * Direct Exchange
     * 是 RabbitMQ 默认的 Exchange，完全根据 RoutingKey 来路由消息。
     * 设置 Exchange 和 Queue 的 Binding 时需指定 RoutingKey（一般为 Queue Name），
     * 发消息时也指定一样的 RoutingKey，消息就会被路由到对应的Queue。
     */
    String DIRECT = "exchange.direct";

    /**
     * Topic Exchange
     * Topic Exchange 和 Direct Exchange 类似，也需要通过 RoutingKey 来路由消息，
     * 区别在于Direct Exchange 对 RoutingKey 是精确匹配，而 Topic Exchange 支持模糊匹配。
     * 分别支持*和#通配符，* 表示匹配一个单词，# 则表示匹配没有或者多个单词。
     */
    String TOPIC = "exchange.topic";

    /**
     * Headers Exchange
     * Headers Exchange 会忽略 RoutingKey 而根据消息中的 Headers 和创建绑定关系时指定的 Arguments 来匹配决定路由到哪些 Queue。
     * <p>
     * Headers Exchange 的性能比较差，而且 Direct Exchange 完全可以代替它，所以不建议使用。
     */
    String HEADERS = "exchange.headers";

    /**
     * Default Exchange
     * 是一种特殊的 Direct Exchange。
     * 当你手动创建一个队列时，后台会自动将这个队列绑定到一个名称为空的 Direct Exchange 上，
     * 绑定 RoutingKey 与队列名称相同。有了这个默认的交换机和绑定，使我们只关心队列这一层即可，
     * 这个比较适合做一些简单的应用。
     */
    String DEFAULT = "exchange.default";
}
